package com.cn.xiaonuo.core.util;

import java.sql.Time;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

/**
 * 
 * 类说明：处理json的工具类，负责json数据转换成java对象和java对象转换成json    
 *   需要四个包：  org.apache.commons(3.2以上版本)
	org.apache.oro
	net.sf.ezmorph(ezmorph-1.0.4.jar)
	json-lib
 * @author 聂枫
 * 2015年8月12日
 */
public class JsonUtils{   
	
	private static ObjectMapper objectMapper = null;
    
    static {
        objectMapper = new ObjectMapper();
    }
    
    public static String stringify(Object object) {
        try {
            return objectMapper.writeValueAsString(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
	
	/***
	 * 将obj转换为json格式
	 * @param obj
	 * @return
	 */
	public static String jsonFromObject(Object obj) {
	     if(obj==null){
	    	 throw new IllegalArgumentException("tsfa-mvc-jsonutils需要转换的json对象为空");
	     }
	     JSONObject ja = JSONObject.fromObject(obj);
		return  ja.toString();
	}
	
	/**
	 * 
	 * 方法说明：将json字符串转换为数组
	 * @author 聂枫
	 * 2015年8月12日下午10:10:23
	 * @param json
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static List listFromJson(String json, Class clazz) {
		JSONArray jsonarray = JSONArray.fromObject(json);
		return (List) JSONArray.toCollection(jsonarray, clazz);
	}
	
	@SuppressWarnings("rawtypes")
	public static String listToJson(List list){
		JSONArray json = JSONArray.fromObject(list);     
        return json.toString();
	}
	
	/**
	 * 
	 * 方法说明：将obj转换为json格式
	 * @author 聂枫
	 * 2015年8月12日下午10:10:33
	 * @param obj
	 * @param config
	 * @return
	 */
	public static String jsonFromObject(Object obj, JsonConfig config) {
	     if(obj==null){
	    	 throw new IllegalArgumentException("tsfa-mvc-jsonutils需要转换的json对象为空");
	     }
	     JSONObject ja = JSONObject.fromObject(obj,config);
		return  ja.toString();
	}
	
	public static String jsonFromObject_AllToString(Object obj) {
		if(obj==null){
	    	 throw new IllegalArgumentException("tsfa-mvc-jsonutils需要转换的json对象为空");
	     }
	     JsonConfig config = new JsonConfig();  
	     config.registerJsonValueProcessor(Long.class,new LongJsonValueProcessor());
	     config.registerJsonValueProcessor(Time.class,new DateJsonValueProcessor());
	     config.registerJsonValueProcessor(Date.class,new DateJsonValueProcessor());
	     JSONObject ja = JSONObject.fromObject(obj,config);
		return  ja.toString() ;  
	}
	
	/**
	 * 
	 * 方法说明：JSON对象转换Map
	 * @author 聂枫
	 * 2015年8月12日下午10:10:41
	 * @param json
	 * @return
	 */
	public static Map<String, String> mapFromJson(String json){
		JSONObject ja = JSONObject.fromObject(json);    
		return toMap(ja);
	} 
	
	/***
	 * json字符串
	 * @param json
	 * @param cls
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object objectFromJson(String json,Class cls){
		return objectFromJson(json, cls, null);	 
	} 
	
	/**
	 * 
	 * 方法说明：将json串转为复杂对象（对象属性包括List、 Map、ArrayList、自定义类型）
	 * @author 聂枫
	 * 2015年8月12日下午10:10:54
	 * @param json
	 * @param cls
	 * @param classMap
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static Object objectFromJson(String json, Class cls, Map<String, Class> classMap){
		if(String.class.equals(cls))	//如果转换为字符串，则直接返回
			return json;
		JSONObject ja = JSONObject.fromObject(json);    
		if( Map.class.equals(cls) ) 
			return toMap(ja);
		else return JSONObject.toBean(ja, cls, classMap);		 
	} 

	/***
	 * JSON对象转换Map
	 * @param jsonObject
	 * @return
	 */
	 @SuppressWarnings("unchecked") 
    private static Map<String, String> toMap(JSONObject jsonObject)  { 
        Map<String, String> result = new HashMap<String, String>(); 
        Iterator<String> iterator = jsonObject.keys(); 
        String key = null; 
        String value = null; 
        while (iterator.hasNext()) { 
            key = iterator.next(); 
            value = jsonObject.getString(key); 
            result.put(key, "null".equalsIgnoreCase(value) ? null : value); 
        } 
        return result; 
    }
	  
}      
